home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 23
/
Amiga Format AFCD23 (Feb 1998, Issue 107).iso
/
+look_here_1st!+
/
reader_requests
/
alienbreed3d2
/
cheesesauce
/
st-replay.s
< prev
next >
Wrap
Text File
|
1997-11-28
|
7KB
|
349 lines
******************************************
* Master Soundtracker V1.0 replayroutine *
* based on V9.0 of DOC *******************
******************************************
* Improved by TIP of The New Masters in JULY 1988 *
start: bsr.s start_muzak
main: btst #6,$bfe001
bne.s main
bsr.L stop_muzak
moveq #0,d0
rts
start_muzak:
move.l #data,muzakoffset ;** get offset
init0: move.l muzakoffset,a0 ;** get highest used pattern
add.l #472,a0
move.l #$80,d0
clr.l d1
init1: move.l d1,d2
subq.w #1,d0
init2: move.b (a0)+,d1
cmp.b d2,d1
bgt.s init1
dbf d0,init2
addq.b #1,d2
init3: move.l muzakoffset,a0 ;** calc samplepointers
lea pointers(pc),a1
lsl.l #8,d2
lsl.l #2,d2
add.l #600,d2
add.l a0,d2
moveq #14,d0
init4: move.l d2,(a1)+
clr.l d1
move.w 42(a0),d1
lsl.l #1,d1
add.l d1,d2
add.l #30,a0
dbf d0,init4
init5: clr.w $dff0a8 ;** clear used values
clr.w $dff0b8
clr.w $dff0c8
clr.w $dff0d8
clr.w timpos
clr.l trkpos
clr.l patpos
init6: move.l muzakoffset,a0 ;** initialize timer irq
move.b 470(a0),numpat+1 ;number of patterns
move.l $6c.w,lev3save+2
move.l #lev3interrupt,$6c.w
rts
stop_muzak:
move.l lev3save+2,$6c.w
clr.w $dff0a8
clr.w $dff0b8
clr.w $dff0c8
clr.w $dff0d8
move.w #$f,$dff096
rts
lev3interrupt:
bsr.s replay_muzak
lev3save:
jmp $0
replay_muzak:
movem.l d0-d7/a0-a6,-(a7)
addq.w #1,timpos
speed: cmp.w #6,timpos
beq.L replaystep
chaneleffects: ;** seek effects
lea datach0(pc),a6
tst.b 3(a6)
beq.s ceff1
lea $dff0a0,a5
bsr.s ceff5
ceff1: lea datach1(pc),a6
tst.b 3(a6)
beq.s ceff2
lea $dff0b0,a5
bsr.s ceff5
ceff2: lea datach2(pc),a6
tst.b 3(a6)
beq.s ceff3
lea $dff0c0,a5
bsr.s ceff5
ceff3: lea datach3(pc),a6
tst.b 3(a6)
beq.s ceff4
lea $dff0d0,a5
bsr.s ceff5
ceff4: movem.l (a7)+,d0-d7/a0-a6
rts
ceff5: move.b 2(a6),d0 ;room for some more
and.b #$f,d0 ;implementations below
tst.b d0
beq.s arpreggiato
cmp.b #1,d0
beq.L pitchup
cmp.b #2,d0
beq.L pitchdown
cmp.b #12,d0
beq.L setvol
cmp.b #14,d0
beq.L setfilt
cmp.b #15,d0
beq.L setspeed
rts
arpreggiato: ;** spread by time
cmp.w #1,timpos
beq.s arp1
cmp.w #2,timpos
beq.s arp2
cmp.w #3,timpos
beq.s arp3
cmp.w #4,timpos
beq.s arp1
cmp.w #5,timpos
beq.s arp2
rts
arp1: clr.l d0 ;** get higher note-values
move.b 3(a6),d0 ; or play original
lsr.b #4,d0
bra.s arp4
arp2: clr.l d0
move.b 3(a6),d0
and.b #$f,d0
bra.s arp4
arp3: move.w 16(a6),d2
bra.s arp6
arp4: lsl.w #1,d0
clr.l d1
move.w 16(a6),d1
lea notetable,a0
arp5: move.w (a0,d0.w),d2
cmp.w (a0),d1
beq.s arp6
addq.l #2,a0
bra.s arp5
arp6: move.w d2,6(a5)
rts
pitchdown:
bsr.s newrou
clr.l d0
move.b 3(a6),d0
and.b #$f,d0
add.w d0,(a4)
cmp.w #$358,(a4)
bmi.s ok1
move.w #$358,(a4)
ok1: move.w (a4),6(a5)
rts
pitchup:bsr.s newrou
clr.l d0
move.b 3(a6),d0
and.b #$f,d0
sub.w d0,(a4)
cmp.w #$71,(a4)
bpl.s ok2
move.w #$71,(a4)
ok2: move.w (a4),6(a5)
rts
setvol: move.b 3(a6),8(a5)
rts
setfilt:move.b 3(a6),d0
and.b #1,d0
lsl.b #1,d0
and.b #$fd,$bfe001
or.b d0,$bfe001
rts
setspeed:
clr.l d0
move.b 3(a6),d0
and.b #$f,d0
move.w d0,speed+2
rts
newrou: cmp.l #datach0,a6
bne.s next1
lea voi1(pc),a4
rts
next1: cmp.l #datach1,a6
bne.s next2
lea voi2(pc),a4
rts
next2: cmp.l #datach2,a6
bne.s next3
lea voi3(pc),a4
rts
next3: lea voi4(pc),a4
rts
replaystep: ;** work next pattern-step
clr.w timpos
move.l muzakoffset,a0
move.l a0,a3
add.l #12,a3 ;ptr to soundprefs
move.l a0,a2
add.l #472,a2 ;ptr to pattern-table
add.l #600,a0 ;ptr to first pattern
clr.l d1
move.l trkpos,d0 ;get ptr to current pattern
move.b (a2,d0),d1
lsl.l #8,d1
lsl.l #2,d1
add.l patpos,d1 ;get ptr to current step
clr.w enbits
lea $dff0a0,a5 ;chanel 0
lea datach0(pc),a6
bsr.L chanelhandler
lea $dff0b0,a5 ;chanel 1
lea datach1(pc),a6
bsr.L chanelhandler
lea $dff0c0,a5 ;chanel 2
lea datach2(pc),a6
bsr.L chanelhandler
lea $dff0d0,a5 ;chanel 3
lea datach3(pc),a6
bsr.L chanelhandler
move.w #400,d0 ;** wait a while and set len
rep1: dbf d0,rep1 ; of oneshot to 1 word
move.w #$8000,d0
or.w enbits,d0
move.w d0,$dff096
cmp.w #1,datach0+14
bne.s rep2
clr.w datach0+14
move.w #1,$dff0a4
rep2: cmp.w #1,datach1+14
bne.s rep3
clr.w datach1+14
move.w #1,$dff0b4
rep3: cmp.w #1,datach2+14
bne.s rep4
clr.w datach2+14
move.w #1,$dff0c4
rep4: cmp.w #1,datach3+14
bne.s rep5
clr.w datach3+14
move.w #1,$dff0d4
rep5: add.l #16,patpos ;next step
cmp.l #64*16,patpos ;pattern finished ?
bne.s rep6
clr.l patpos
addq.l #1,trkpos ;next pattern in table
clr.l d0
move.w numpat,d0
cmp.l trkpos,d0 ;song finished ?
bne.s rep6
clr.l trkpos
rep6: movem.l (a7)+,d0-d7/a0-a6
rts
chanelhandler:
move.l (a0,d1.l),(a6) ;get period & action-word
addq.l #4,d1 ;point to next chanel
clr.l d2
move.b 2(a6),d2 ;get nibble for soundnumber
lsr.b #4,d2
beq.s chan2 ;no soundchange !
move.l d2,d4 ;** calc ptr to sample
lsl.l #2,d2
mulu #30,d4
lea pointers-4(pc),a1
move.l (a1,d2.l),4(a6) ;store sample-address
move.w (a3,d4.l),8(a6) ;store sample-len in words
move.w 2(a3,d4.l),18(a6) ;store sample-volume
move.l d0,-(a7)
move.b 2(a6),d0
and.b #$f,d0
cmp.b #$c,d0
bne.s ok3
move.b 3(a6),8(a5)
bra.s ok4
ok3: move.w 2(a3,d4.l),8(a5) ;change chanel-volume
ok4: move.l (a7)+,d0
clr.l d3
move.w 4(a3,d4),d3 ;** calc repeatstart
add.l 4(a6),d3
move.l d3,10(a6) ;store repeatstart
move.w 6(a3,d4),14(a6) ;store repeatlength
cmp.w #1,14(a6)
beq.s chan2 ;no sustainsound !
move.l 10(a6),4(a6) ;repstart = sndstart
move.w 6(a3,d4),8(a6) ;replength = sndlength
chan2: tst.w (a6)
beq.s chan4 ;no new note set !
move.w 22(a6),$dff096 ;clear dma
tst.w 14(a6)
bne.s chan3 ;no oneshot-sample
move.w #1,14(a6) ;allow resume (later)
chan3: bsr.L newrou
move.w (a6),(a4)
move.w (a6),16(a6) ;save note for effect
move.l 4(a6),0(a5) ;set samplestart
move.w 8(a6),4(a5) ;set samplelength
move.w (a6),6(a5) ;set period
move.w 22(a6),d0
or.w d0,enbits ;store dma-bit
move.w 18(a6),20(a6) ;volume trigger
chan4: rts
datach0: dcb.w 11,0
dc.w 1
datach1: dcb.w 11,0
dc.w 2
datach2: dcb.w 11,0
dc.w 4
datach3: dcb.w 11,0
dc.w 8
voi1: dc.w 0
voi2: dc.w 0
voi3: dc.w 0
voi4: dc.w 0
pointers: dcb.l 15,0
notetable: dc.w 856,808,762,720,678,640,604,570
dc.w 538,508,480,453,428,404,381,360
dc.w 339,320,302,285,269,254,240,226
dc.w 214,202,190,180,170,160,151,143
dc.w 135,127,120,113,000
muzakoffset: dc.l 0
trkpos: dc.l 0
patpos: dc.l 0
numpat: dc.w 0
enbits: dc.w 0
timpos: dc.w 0
data: incbin "work:andy's_tunes/twochantrack"
end: